package demo.utils;


import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

@Component
public class DateUtil extends DateUtils{

    Logger logger = LoggerFactory.getLogger(DateUtil.class);

    /**
     * yyyy：年
     * MM：月
     * dd：日
     * hh：1~12小时制(1-12)
     * HH：24小时制(0-23)
     * mm：分
     * ss：秒
     * S：毫秒
     * E：星期几
     * D：一年中的第几天
     * F：一月中的第几个星期(会把这个月总共过的天数除以7)
     * w：一年中的第几个星期
     * W：一月中的第几星期(会根据实际情况来算)
     * a：上下午标识
     * k：和HH差不多，表示一天24小时制(1-24)。
     * K：和hh差不多，表示一天12小时制(0-11)。
     * z：表示时区
     */
    public static final String PATTERN_yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
    public static final String PATTERN_yyyy_MM_dd_HH_mm_ss_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String PATTERN_yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";
    public static final String PATTERN_yyyy_MM_dd = "yyyy-MM-dd";


    /**
     * 格式化时间
     *
     * @param date 时间
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String formatDateTime(Date date) {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
    }

    /**
     * 格式化时间
     * yyyy：年
     * MM：月
     * dd：日
     * hh：1~12小时制(1-12)
     * HH：24小时制(0-23)
     * mm：分
     * ss：秒
     * S：毫秒
     * E：星期几
     * D：一年中的第几天
     * F：一月中的第几个星期(会把这个月总共过的天数除以7)
     * w：一年中的第几个星期
     * W：一月中的第几星期(会根据实际情况来算)
     * a：上下午标识
     * k：和HH差不多，表示一天24小时制(1-24)。
     * K：和hh差不多，表示一天12小时制(0-11)。
     * z：表示时区
     *
     * @param date 时间
     */
    public static String formatDateTime(Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }

    public static Date formatDateTime(String dateStr, String pattern) {
        try {
            return new SimpleDateFormat(pattern).parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取今天日期
     *
     * @return <date> eg:2018-7-30 00:00:00
     */
    public static String getDateToday() {
        Calendar date = Calendar.getInstance();
        date.set(Calendar.getInstance().get(1), Calendar.getInstance().get(2), Calendar.getInstance().get(5), 0, 0, 0);
        return formatDateTime(date.getTime(), PATTERN_yyyy_MM_dd);
    }

    /**
     * 获取现在时间
     *
     * @return <date> eg:2018-7-30 12:00:01
     */
    public static String getNow() {
        Calendar date = Calendar.getInstance();
        return formatDateTime(date.getTime(), PATTERN_yyyy_MM_dd_HH_mm_ss);
    }



    /**
     * 判断是不是同一天
     *
     * @param date1 第一天
     * @param date2 第二天
     * @return Boolean
     */
    public static boolean isSameDay(Date date1, Date date2) {
        Calendar calendar1;
        Calendar calendar2;
        try {
            calendar1 = DateUtils.toCalendar(date1);
            calendar2 = DateUtils.toCalendar(date2);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return calendar1.get(1) == calendar2.get(1) && calendar1.get(2) == calendar2.get(2) && calendar1.get(5) == calendar2.get(5);
    }

    /**
     * 判断第一天比第二天早
     *
     * @param date1
     * @param date2
     * @return
     */
    public static boolean day1BeforeDay2(Date date1, Date date2) {
        return !isSameDay(date1, date2) && date1.before(date2);
    }

    public static String formatDuring(long mss) {
        String r;
        long days = mss / (1000 * 60 * 60 * 24);
        long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
        long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);
        long seconds = (mss % (1000 * 60)) / 1000;
        if (days > 0) {
            r = days + " days " + hours + " hours " + minutes + " minutes " + seconds + " seconds";
        } else if (hours > 0) {
            r = hours + " hours " + minutes + " minutes " + seconds + " seconds";
        } else if (minutes > 0) {
            r = minutes + " minutes " + seconds + " seconds";
        } else {
            r = seconds + " seconds";
        }
        return r;
    }

}
